home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / debugger / bdm-linu.0 / bdm-linu / bdm-linux / bdm-util.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-27  |  4.2 KB  |  205 lines

  1. /* bdm-util.c - utility functions for BDM driver package */
  2.  
  3. #include    <stdio.h>
  4. #include    <ctype.h>
  5. #include    "textio.h"
  6. #include    "bdmcalls.h"
  7. #include    "bdm-util.h"
  8.  
  9. #define FREAD(x,y) if ((y = fgetc (x)) == EOF) return 0
  10. #define CFREAD(x,y) if ((y = fgetc (x)) == EOF) return 0;\
  11.             icheck = (icheck << 4) + htoc (y)
  12. static BYTE checksum;
  13. static char DefaultRecordString [] = ".";
  14. char *PrintEachRecord = DefaultRecordString;
  15. LONG ExecuteAddress;
  16.  
  17. /* htoc returns binary value of hex character */
  18.  
  19. static int htoc (char c)
  20. {
  21.     c = toupper (c);
  22.     if (c > '9') c -= ('A' - 10);
  23.     else c -= '0';
  24.     return c;
  25. }
  26.  
  27. /* collect returns the value of the next (howmany) character pairs
  28.  * counter is decremented for each character pair read
  29.  */
  30.  
  31. static long collect (int howmany,int *counter, FILE *infile)
  32. {
  33.     long stuff;
  34.     int icheck,c;
  35.  
  36.     for (stuff = 0;howmany--;)
  37.     {
  38.         icheck = 0;
  39.         CFREAD (infile,c);
  40.         stuff = (stuff << 4) + htoc (c);
  41.         CFREAD (infile,c);
  42.         stuff = (stuff << 4) + htoc (c);
  43.         (*counter)--;
  44.         checksum += icheck;
  45.     }
  46.     return (stuff);
  47. }
  48.  
  49. static BYTE sr_fetch (BYTE **where, BYTE *ctr)
  50. {
  51.     BYTE temp;
  52.  
  53.     (*ctr)--;
  54.     temp = **where;
  55.     (*where)++;
  56.     return temp;
  57. }
  58.  
  59. int do_srec (srecord *where, FILE *infile)
  60. {
  61.     int ctr,asize,c;
  62.     BYTE *put, s9flag = 0;
  63.  
  64.     do c = fgetc (infile);
  65.     while (c != 'S' && c != EOF);
  66.     if (c == EOF) return SREC_EOF;
  67.     FREAD (infile,where->rectype);
  68.     switch (where->rectype)
  69.     {
  70.         case    '0':
  71.         asize = 2;
  72.         break;
  73.  
  74.         case    '1':
  75.         case '2':
  76.         case '3':
  77.         asize = 1 + where->rectype - '0';
  78.         break;
  79.  
  80.         case    '7':
  81.         case '8':
  82.         case '9':
  83.         asize = 11 - (where->rectype - '0');
  84.         s9flag = 1;
  85.         break;
  86.  
  87.         default:
  88.         return SREC_FORMAT;
  89.     }
  90.     checksum = 0;
  91.     where->reclen = collect (1,&c, infile);
  92.     where->address = 0;
  93.     for (ctr = asize; ctr; ctr--)
  94.     {
  95.         where->address <<= 8;
  96.         where->address |= collect (1,&where->reclen, infile);
  97.     }
  98.     put = where->bytes;
  99.     for (ctr = where->reclen-1; ctr; )
  100.         *put++ = collect (1, &ctr, infile);
  101.     collect (1, &where->reclen, infile);
  102.     if (checksum != 0xff) return SREC_CHECKSUM;
  103.     where->reclen += 4;
  104.     return s9flag ? SREC_S9 : 0;
  105. }
  106.  
  107. void put_srec (srecord *data, LONG load_offset)
  108. {
  109.     LONG temp, address;
  110.     BYTE reclen, *where;
  111.     int ctr;
  112.  
  113.     if (data->reclen < 5) return;
  114.     reclen = data->reclen - 4;
  115.     address = data->address;
  116.     if (data->rectype >= '7' && data->rectype <= '9')
  117.     {
  118.         ExecuteAddress = address;
  119.         return;
  120.     }
  121.     if (data->rectype == '0') return;
  122.     where = data->bytes;
  123.     if (reclen && (load_offset + address) & 1)
  124.     {
  125.         PutByte (load_offset + address, sr_fetch (&where, &reclen));
  126.         address++;
  127.     }
  128.     else if (reclen >= 2)
  129.     {
  130.         temp = sr_fetch (&where, &reclen);
  131.         PutWord (load_offset + address, (WORD) ((temp << 8) + sr_fetch (&where, &reclen)));
  132.         address += 2;
  133.     }
  134.     else if (reclen)
  135.     {
  136.         PutByte (load_offset + address, sr_fetch (&where, &reclen));
  137.         address++;
  138.     }
  139.     while (reclen >= 4)
  140.     {
  141.         temp = sr_fetch (&where, &reclen);
  142.         temp = (temp << 8) + sr_fetch (&where, &reclen);
  143.         temp = (temp << 8) + sr_fetch (&where, &reclen);
  144.         FillLong (load_offset + address, (LONG) ((temp << 8) + sr_fetch (&where, &reclen)));
  145.         address += 4;
  146.     }
  147.     if (reclen & 2)
  148.     {
  149.         temp = sr_fetch (&where, &reclen);
  150.         FillWord (address, (WORD) ((temp << 8) + sr_fetch (&where, &reclen)));
  151.         address += 2;
  152.     }
  153.     if (reclen)
  154.     {
  155.         FillByte (address, sr_fetch (&where, &reclen));
  156.         address++;
  157.     }
  158. }
  159.  
  160. int do_load (LONG load_offset, char *infilename)
  161. {
  162.     srecord buff;
  163.     int error, rcount, fcset;
  164.     FILE *infile = fopen (infilename, "r");
  165.  
  166.     if (!infile) return -1;
  167.     ExecuteAddress = 0;
  168.     StopChip ();
  169.     fcset = set_fc ();
  170.     for (error = rcount = 0; !error; rcount++)
  171.     {
  172.         error = do_srec (&buff, infile);
  173.         if (!error || error == SREC_S9) put_srec (&buff,load_offset);
  174.         if (PrintEachRecord) printf (PrintEachRecord);
  175.     }
  176.     putchar ('\n');
  177.     switch (error)
  178.     {
  179.         case SREC_EOF:
  180.         printf ("EOF Reached before S9 record on line %d\n", rcount);
  181.         break;
  182.  
  183.         case SREC_CHECKSUM:
  184.         printf ("Checksum error in S-record no. %d\n", rcount);
  185.         break;
  186.  
  187.         case SREC_S9:
  188.         printf ("Download completed OK - %d records read\n", rcount);
  189.         error = 0;
  190.         break;
  191.  
  192.         case SREC_FORMAT:
  193.         printf ("Format error on line %d - file probably not S-records\n",
  194.             rcount);
  195.         break;
  196.  
  197.         default:
  198.         printf ("Internal error - do_srec returned %d on line %d\n",
  199.             error, rcount);
  200.     }
  201.     fclose (infile);
  202.     if (fcset) restore_fc ();
  203.     return error;
  204. }
  205.